package lesson09;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * 使用Callable描述任务并创建线程
 *

 * @Date 2023-02-07
 */
public class Demo_1101_Callable {
    public static void main(String[] args) {
        // 通过Callable定义线程的任务
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                // 这里是具体要处理的任务
                System.out.println("执行运算..");
                int a = 10 + 20;
                // 等待3秒返回
                TimeUnit.SECONDS.sleep(3);
//                throw new Exception("任务执行过程中出现异常");
                return a;
            }
        };

        // Callable要配合FutureTask一起使用，FutureTask是用来获取Callable的执行结果的
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        // FutureTask当做构造参数传入Thread的构造方法里
        Thread thread = new Thread(futureTask);
        // 启动线程
        thread.start();

        try {
            // 阻塞等待Callable任务的执行结果
            Integer result = futureTask.get();
            System.out.println("线程的执行结果：" + result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
            System.out.println("捕获到任务异常：" + e.getMessage());
        }

    }
}
